#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<unistd.h>
#include<sys/wait.h>
#include<sys/types.h>
#define NUM 1024
#define SIZE 24
#define SEP " "
char cmd_line[NUM];//保存完整的命令
char * g_argv[SIZE];//保存分割之后的命令行字符串
int main()
{
  while(1)//命令行解释器，是一个常驻内存的进程，不退出
  {
        printf("[root@localhost myshell]#");
        fflush(stdout);
        memset(cmd_line,'\0',sizeof cmd_line);
        if(fgets(cmd_line,sizeof cmd_line,stdin)==NULL)//用户没有输入命令
        {
          continue;
        }
          cmd_line[strlen(cmd_line)-1]='\0';
          //获取到输入的命令字符串，进行字符串解析
          
          g_argv[0]=strtok(cmd_line,SEP);//首次分割，传入原始字符串
          int index=1;
          if(strcmp(g_argv[0],"ls")==0)
          {
            g_argv[index++]="--color=auto";
          }
          if(strcmp(g_argv[0],"ll")==0)
          {
            g_argv[0]="ls";
            g_argv[index++]="-l";
            g_argv[index++]="--color=auto";
          }

          
          while(g_argv[index++]=strtok(NULL,SEP));//后序还要分割，传入NULL
        //cd命令是内置命令,即让父进程自己执行的命令，不用创建子进程去执行
        if(strcmp(g_argv[0],"cd")==0)
        {
             if(g_argv[1]!=NULL)
             {
                int ret= chdir(g_argv[1]);//更改路径
                if(ret==-1)
                  printf("no such directory\n");
             }
             continue;
        }
        pid_t id=fork();
        if(id==0)//子进程
        {
          printf("下面的功能让子进程执行\n");
          execvp(g_argv[0],g_argv);
          exit(1);
        }
        int status=0;
        pid_t ret=waitpid(id,&status,0);
        if(ret>0)
        {
          printf("exit code:%d\n",WEXITSTATUS(status));

        }
  }
  return 0;
}
